// 定义State
// 'state' should be a method that returns an object in store/user.js 
// 在nuxt中State必须声明为一个函数，且返回一个 对象
export const state = () => ({
    userinfo: {
        token: '',
        user: {}
    },
    backurl: '',   // 用来存储回跳的页面路径
})

//定义mutations--用来给state中的成员赋值，同步使用mutations
export const mutations = {
    //有一个默认参数是 state
    setUserInfo(state, data) {     //登录成功后调用这个方法，保存用户信息
        state.userinfo = data
        // state.userinfo.token = data.token
        // state.userinfo.user = data.user
    },
    //退出登录 --清除用户信息 
    // cleanUserInfo(state, data) {
    //     //清除store中用户信息 --赋值
    //     state.userinfo = {}  //将store中的信息赋值为空
    // }
    //--方法2【优化】：其实是一个给store赋值的过程可优化，组件调用setUserInfo也可完成
    // 保存订单页的回调路径   --未登录状态下，-登录-回到订单页操作需要
    setBackurl(state, data) {
        state.backurl = data;  //给state成员赋值
    }
}

//定义actions   --将登录操作（异步）封装到这里
export const actions = {
    // 这个函数中可以来执行异步操作，拿到异步操作的结果，调用mutaitons中的方法，达到为state中的成员赋值的目的
    setUserInfoAciton(store, data) {
        // store就是当前的仓库对象，里面的commit函数可以调用mutations中的成员
        // 🚩调用mutations中的成员
        store.commit('setUserInfo', data)
    },
    // 将登录请求操作（异步）封装到action中
    loginAction({ commit }, canshu) {   // 会默认传递store对象，这个对象中有一个成员commit
        //异步请求--发送登录请求，
        return this.$axios({   //return 告诉外围这是一个promise对象，可以进行.then .catch
            method: 'post',
            url: '/accounts/login',
            data: canshu
        })
            .then(res => {
                //请求成功,将当前的用户信息存储到store 
                commit('setUserInfo', res.data)
                return res  // 如果在外围还需要使用这个值，则必须返回
            })
        // .catch(err => {   不能在这里使用,否则输入错误的登录信息也成功提示  即执行了 loginform.vue中的.then
        //     // return err
        // })
    }
}
